﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;//引入反射命名空间
using System.Text;
using System.Threading.Tasks;

namespace _00_反射_基础知识
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("==========================反射加载DLL 方式一==========================");
            //加载指定路径下的dll文件
            string dllPath = "C:\\Users\\Admin\\source\\repos\\3_25_委托_事件_多线_学习\\ClassLibrary\\bin\\Debug\\ClassLibrary.dll";
            //加载dll文件 （LoadFile：需要传入绝对路径）
            Assembly assembly = Assembly.LoadFile(dllPath);
            //通过指定类的名称，获取类的结构
            Type type = assembly.GetType("ClassLibrary.TEST");
            //实例化类=>无参构造函数
            object obj1 = Activator.CreateInstance(type);
            //实例化类=>有参构造函数
            object obj2 = Activator.CreateInstance(type, new object[] { "张三" });

            Console.WriteLine("==========================反射加载DLL 方式二==========================");
            //加载指定路径下的dll文件
            string dllPath1 = "./ClassLibrary.dll";
            //加载dll文件 （LoadFrom：需要传入相对路径）
            Assembly assembly1 = Assembly.LoadFrom(dllPath1);
            //通过指定类的名称，获取类的结构
            Type type1 = assembly1.GetType("ClassLibrary.TEST");
            //实例化类=>无参构造函数
            object obj3 = Activator.CreateInstance(type1);
            //实例化类=>有参构造函数
            object obj4 = Activator.CreateInstance(type1, new object[] { "李四" });

            Console.WriteLine("==========================反射加载DLL 方式三==========================");
            //加载指定路径下的文件
            string dllPath2 = "ClassLibrary";
            //加载dll文件 （Load：需要传入文件名，当时文件需要再当前路径下）
            Assembly assembly2 = Assembly.Load(dllPath2);
            //通过指定类的名称，获取类的结构
            Type type2 = assembly2.GetType("ClassLibrary.TEST");
            //实例化类=>无参构造函数
            object obj5 = Activator.CreateInstance(type2);
            //实例化类=>有参构造函数
            object obj6 = Activator.CreateInstance(type2, new object[] { "王五" });
            
            Console.WriteLine("==========================反射调用静态方法==========================");
            //加载动态链接库并获取指定的类结构
            Type type3 = Assembly.Load("ClassLibrary").GetType("ClassLibrary.TEST");
            //使用静态方法
            type3.InvokeMember(
                "StaticMethod1",//方法名称
                BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static,//方法修饰符
                null, //方法的属性 (是否为外部方法)
                null, //方法的实例 (null表示静态方法)
                null //方法的参数 (null表示无参数)
                );

            //使用静态方法--有参数
            type3.InvokeMember(
                "StaticMethod2",//方法名称
                BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static,//方法修饰符
                null, //方法的属性 (是否为外部方法)
                null, //方法的实例 (null表示静态方法)
                new object[] { "张三" } //方法的参数 (null表示无参数)
                );

            Console.Read();
        }
    }
}
